package blbetter.netze;

import java.util.Arrays;
import java.util.Vector;

import blbetter.db.BLDataBase;
import blbetter.db.Spiel;
import blbetter.db.Tabelle;

public class BlBetterInputSitV2 implements BlBetterInputSit {

	private double[] input = new double[16];

	private boolean hasError = false;

	public BlBetterInputSitV2(Spiel spiel, int X, int Y, BLDataBase db) {
		// statistiken der letzten spiele erstellen
		int heimId = spiel.heimId;
		int gastId = spiel.gastId;
		int saisonId = spiel.saisonId;
		Vector<Spiel> letzteSpieleHeim = db.getLetzteNSpieleByTeam(heimId, X
				+ Y, saisonId, spiel.spieltag);
		Vector<Spiel> letzteSpieleGast = db.getLetzteNSpieleByTeam(gastId, X
				+ Y, saisonId, spiel.spieltag);
		if (letzteSpieleHeim.size() < X + Y) {
			System.err
					.println("BlBetterInputSitV2() error letzteSpieleHeim - size: "
							+ letzteSpieleHeim.size());
			System.err.println("Spiel: " + spiel);
			System.err.println(letzteSpieleHeim);
			hasError = true;
			return;
		}
		if (letzteSpieleGast.size() < X + Y) {
			System.err
					.println("BlBetterInputSitV2() error letzteSpieleGast - size: "
							+ letzteSpieleGast.size());
			System.err.println("Spiel: " + spiel);
			System.err.println(letzteSpieleGast);
			hasError = true;
			return;
		}
		Vector<Spiel> letzteXHeim = new Vector<Spiel>(letzteSpieleHeim.subList(
				0, X));
		Vector<Spiel> letzteXGast = new Vector<Spiel>(letzteSpieleGast.subList(
				0, X));
		Vector<Spiel> letzteYAbXHeim = new Vector<Spiel>(letzteSpieleHeim
				.subList(X, X + Y));
		Vector<Spiel> letzteYAbXGast = new Vector<Spiel>(letzteSpieleGast
				.subList(X, X + Y));

		int[] punkteToreHeimX = Util
				.getPkteUToreFromSpiele(heimId, letzteXHeim);
		int[] punkteToreGastX = Util
				.getPkteUToreFromSpiele(gastId, letzteXGast);
		int[] punkteToreHeimY = Util.getPkteUToreFromSpiele(heimId,
				letzteYAbXHeim);
		int[] punkteToreGastY = Util.getPkteUToreFromSpiele(gastId,
				letzteYAbXGast);

		// System.out.println("PktToreHeim: " +
		// Arrays.toString(punkteToreHeim));
		// System.out.println("PktToreGast: " +
		// Arrays.toString(punkteToreGast));

		double durchsPkteDiffX = ((double) punkteToreHeimX[0] - (double) punkteToreGastX[0])
				/ (double) X;

		double durchsPkteDiffY = ((double) punkteToreHeimY[0] - (double) punkteToreGastY[0])
				/ (double) Y;

		double durchsGeschossHeimX = (double) punkteToreHeimX[1] / (double) X;
		double durchsGeschossGastX = (double) punkteToreGastX[1] / (double) X;
		double durchsGekriegtHeimX = (double) punkteToreHeimX[2] / (double) X;
		double durchsGekriegtGastX = (double) punkteToreGastX[2] / (double) X;

		double durchsGeschossHeimY = (double) punkteToreHeimY[1] / (double) Y;
		double durchsGeschossGastY = (double) punkteToreGastY[1] / (double) Y;
		double durchsGekriegtHeimY = (double) punkteToreHeimY[2] / (double) Y;
		double durchsGekriegtGastY = (double) punkteToreGastY[2] / (double) Y;

		Tabelle tabelle = new Tabelle(saisonId, spiel.spieltag, db);

		int platzHeim = tabelle.getPlatz(heimId);
		int platzGast = tabelle.getPlatz(gastId);

		// input setzen
		setInput(durchsPkteDiffX, durchsPkteDiffY, durchsGeschossHeimX,
				durchsGeschossGastX, durchsGekriegtHeimX, durchsGekriegtGastX,
				durchsGeschossHeimY, durchsGeschossGastY, durchsGekriegtHeimY,
				durchsGekriegtGastY, spiel.spieltag, platzHeim, platzGast);
	}

	private void setInput(double durchsPkteDiffX, double durchsPkteDiffY,
			double durchsGeschossHeimX, double durchsGeschossGastX,
			double durchsGekriegtHeimX, double durchsGekriegtGastX,
			double durchsGeschossHeimY, double durchsGeschossGastY,
			double durchsGekriegtHeimY, double durchsGekriegtGastY,
			int spieltag, int platzHeim, int platzGast) {
		// System.out.print("Durchs.PkteDiff.: " + durchsPkteDiff);
		input[0] = (durchsPkteDiffX + 3.) / 6.;
		input[1] = (durchsPkteDiffY + 3.) / 6.;
		// System.out.println(" -> Input[0]: " + input[0]);
		// durchs. geschoss. Tore
		// System.out.println("Durchs.Geschossen: " + durchsGeschossHeim + "-"
		// + durchsGeschossGast);
		input[2] = durchsGeschossHeimX / 4.;
		input[3] = durchsGeschossGastX / 4.;
		input[4] = durchsGeschossHeimY / 4.;
		input[5] = durchsGeschossGastY / 4.;
		// druchs. gekriegte Tore
		// System.out.println("Durchs.Gekriegt: " + durchsGekriegtHeim + "-"
		// + durchsGekriegtGast);
		input[6] = durchsGekriegtHeimX / 4.;
		input[7] = durchsGekriegtGastX / 4.;
		input[8] = durchsGekriegtHeimY / 4.;
		input[9] = durchsGekriegtGastY / 4.;
		// spieltag (nur spieltage 19-34)
		double[] spieltagBin = Util.getAsBinaryArr(spieltag - 19, 4);
		input[10] = spieltagBin[0];
		input[11] = spieltagBin[1];
		input[12] = spieltagBin[2];
		input[13] = spieltagBin[3];

		// tabellenplaetze
		input[14] = ((double) platzHeim - 1.) / 17.;
		input[15] = ((double) platzGast - 1.) / 17.;
	}

	@Override
	public double[] getInput() {
		return input;
	}

	public String toString() {
		return Arrays.toString(input);
	}

	@Override
	public boolean hasError() {
		return hasError;
	}
}
